/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package View;

//import ModelOld.Case;
import Controler.*;
import ObserveTools.MessagePlateau;
import java.awt.GridLayout;
import java.util.Observable;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observer;

/**
 *
 * @author goum
 */
public final class PlateauView extends JPanel implements Observer {

    // les dimension de la grille nombre de ligne et colonne
    private int colonne;
    private int ligne;
    protected Controler controler;
    // le tableau des vues des Cases
    public CaseView tableau[][];

    public PlateauView(Controler telcontroler) {
        this.ligne = 10;
        this.colonne = 10;
        this.tableau = new CaseView[ligne][colonne];
        this.controler = telcontroler;
        this.controler.getPlateau().addObserver(this);
        this.setPreferredSize(new Dimension(550, 600));
        this.setLayout(new GridLayout(10, 10, 0, 0));
        this.InitialisePlateauVue();
    }

    /**
     * Cette méthode permet d'initialiser la vue du plateau
     */
    public void InitialisePlateauVue() {
        int i, j; // compteurs pour le nombre de Case

        for (i = 0; i < this.ligne; i++) {
            for (j = 0; j < this.colonne; j++) {
                if (i < 4) {
                    if (i % 2 == 0) {
                        if (j % 2 == 0) {
                            tableau[i][j] = new CaseView(4);
                            tableau[i][j].addActionListener(new ControleurCaseviewListener(i, j));
                        } else {
                            tableau[i][j] = new CaseView(1);
                        }
                    } else {
                        if (j % 2 == 0) {
                            tableau[i][j] = new CaseView(1);
                        } else {
                            tableau[i][j] = new CaseView(4);
                            tableau[i][j].addActionListener(new ControleurCaseviewListener(i, j));
                        }
                    }
                } else if (i > 5) {
                    if (i % 2 == 0) {
                        if (j % 2 == 0) {
                            tableau[i][j] = new CaseView(3);
                            tableau[i][j].addActionListener(new ControleurCaseviewListener(i, j));
                        } else {
                            tableau[i][j] = new CaseView(1);
                        }
                    } else {
                        if (j % 2 == 0) {
                            tableau[i][j] = new CaseView(1);
                        } else {
                            tableau[i][j] = new CaseView(3);
                            tableau[i][j].addActionListener(new ControleurCaseviewListener(i, j));
                        }
                    }
                } else {
                    if (i % 2 == 0) {
                        if (j % 2 == 0) {
                            tableau[i][j] = new CaseView(2);
                            tableau[i][j].addActionListener(new ControleurCaseviewListener(i, j));
                        } else {
                            tableau[i][j] = new CaseView(1);
                        }
                    } else {
                        if (j % 2 == 0) {
                            tableau[i][j] = new CaseView(1);
                        } else {
                            tableau[i][j] = new CaseView(2);
                            tableau[i][j].addActionListener(new ControleurCaseviewListener(i, j));
                        }
                    }
                }
                this.add(tableau[i][j]);
            }
        }
    }

    /**
     * Cette méthode actualise la vue en fonction de ce qu'elle reçoit
     */
    public void update(Observable o, Object ob) {
        MessagePlateau message = (MessagePlateau) ob;
        if (message.getErreur() == 0) {
            if (message.getCase().length == 2) {
                System.out.println("actualiser plateau view\n"
                        + "Case dep : " + message.getCase()[0].getCoordX() + "," + message.getCase()[0].getCoordY() + "\n"
                        + "Case arr : " + message.getCase()[1].getCoordX() + "," + message.getCase()[1].getCoordY() + "\n");
                int indice = 2 * message.getCase()[0].getCoordY() + (message.getCase()[0].getCoordX() % 2);
                int indice2 = 0;
                tableau[message.getCase()[0].getCoordX()][indice].setShowCaseBlack();

                if (message.getCase()[1].isCouleurOccupantWhite()) {
                    if (message.getCase()[1].getOccupant().isDame()) {
                        indice2 = 2 * message.getCase()[1].getCoordY() + (message.getCase()[1].getCoordX() % 2);
                        tableau[message.getCase()[1].getCoordX()][indice2].setShowCaseDameWhite();
                    } else {
                        indice2 = 2 * message.getCase()[1].getCoordY() + (message.getCase()[1].getCoordX() % 2);
                        tableau[message.getCase()[1].getCoordX()][indice2].setShowCasePionWhite();
                    }
                } else {
                    if (message.getCase()[1].getOccupant().isDame()) {
                        indice2 = 2 * message.getCase()[1].getCoordY() + (message.getCase()[1].getCoordX() % 2);
                        tableau[message.getCase()[1].getCoordX()][indice2].setShowCaseDameBlack();
                    } else {
                        indice2 = 2 * message.getCase()[1].getCoordY() + (message.getCase()[1].getCoordX() % 2);
                        tableau[message.getCase()[1].getCoordX()][indice2].setShowCasePionBlack();
                    }
                }

                System.out.println("cases mises a jour\n"
                        + "Case dep : " + message.getCase()[0].getCoordX() + "," + indice + "\n"
                        + "Case arr : " + message.getCase()[1].getCoordX() + "," + indice2 + "\n");
            }

            if (message.getCase().length == 3) {
                System.out.println("actualiser plateau view\n"
                        + "Case dep : " + message.getCase()[0].getCoordX() + "," + message.getCase()[0].getCoordY() + "\n"
                        + "Case proie : " + message.getCase()[1].getCoordX() + "," + message.getCase()[1].getCoordY() + "\n"
                        + "Case arr : " + message.getCase()[2].getCoordX() + "," + message.getCase()[2].getCoordY() + "\n");
                int indice = 2 * message.getCase()[0].getCoordY() + (message.getCase()[0].getCoordX() % 2);
                int indice2 = 2 * message.getCase()[1].getCoordY() + (message.getCase()[1].getCoordX() % 2);
                int indice3 = 0;
                tableau[message.getCase()[0].getCoordX()][indice].setShowCaseBlack();
                tableau[message.getCase()[1].getCoordX()][indice2].setShowCaseBlack();
                if (message.getCase()[2].isCouleurOccupantWhite()) {

                    if (message.getCase()[2].getOccupant().isDame()) {
                        indice3 = 2 * message.getCase()[2].getCoordY() + (message.getCase()[2].getCoordX() % 2);
                        tableau[message.getCase()[2].getCoordX()][indice3].setShowCaseDameWhite();
                    } else {
                        indice3 = 2 * message.getCase()[2].getCoordY() + (message.getCase()[2].getCoordX() % 2);
                        tableau[message.getCase()[2].getCoordX()][indice3].setShowCasePionWhite();
                    }


                } else {

                    if (message.getCase()[2].getOccupant().isDame()) {
                        indice3 = 2 * message.getCase()[2].getCoordY() + (message.getCase()[2].getCoordX() % 2);
                        tableau[message.getCase()[2].getCoordX()][indice3].setShowCaseDameBlack();
                    } else {
                        indice3 = 2 * message.getCase()[2].getCoordY() + (message.getCase()[2].getCoordX() % 2);
                        tableau[message.getCase()[2].getCoordX()][indice3].setShowCasePionBlack();
                    }
                }
                System.out.println("cases mises a jour\n"
                        + "Case dep : " + message.getCase()[0].getCoordX() + "," + indice + "\n"
                        + "Case arr : " + message.getCase()[1].getCoordX() + "," + indice3 + "\n");
            }
        } else if (message.getErreur() == 8) {
            int indice = 2 * message.getCase()[0].getCoordY() + (message.getCase()[0].getCoordX() % 2);
            if (message.getCase()[0].getOccupant().getCouleur().equals("noir")) {
                tableau[message.getCase()[0].getCoordX()][indice].setShowCaseDameBlack();
            } else {
                tableau[message.getCase()[0].getCoordX()][indice].setShowCaseDameWhite();
            }
        }
    }

    /**
     * Cette class me permet de définir mon listener
     */
    class ControleurCaseviewListener implements ActionListener {

        private int x; //ligne de la case qu'on va écoute
        private int y; // colonne de la case qu'on va écouté

        public ControleurCaseviewListener(int telligne, int telcolonne) {
            super();
            this.x = telligne;//ligne de la case qu'on va écoute
            this.y = telcolonne / 2;//colonne de la case qu'on va écoute
        }

        public void actionPerformed(ActionEvent arg0) {
            controler.Deplacer(this.x, this.y);
        }
    }
}
